package br.com.petrobrasrj.view;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Set;

public class Main {

	
	public static void main(String[] args) {
		
		Main m = new Main();
		String texto = "Isso é um teste";
		m.escreverTextoEmArquivo(texto);
		

	}

	
	public void escreverTextoEmArquivo(String texto) {
		try {
//			FacesContext context = FacesContext.getCurrentInstance();
//			ServletContext sc = (ServletContext) context.getExternalContext().getContext();
			
			File diretorio = new File(System.getProperty("user.dir")+"/arquivos");
			if(!diretorio.isDirectory())
				diretorio.mkdir();
			
			
			File arquivo = new File(diretorio,"arquivo.txt");
			if(!arquivo.exists())
				arquivo.createNewFile();

			escrever(arquivo,texto);
			ler(arquivo);
			
			
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	private void escrever(File arq, String string) {
		
		try {
			FileWriter fileWriter;
			fileWriter = new FileWriter(arq, true);
			PrintWriter printWriter = new PrintWriter(fileWriter,true);
			printWriter.append(string);
			printWriter.append(System.getProperty("line.separator"));
			printWriter.flush();
			printWriter.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	
	}
	
	private void ler(File arq){
		try {

			BufferedReader in = new BufferedReader(new FileReader(arq));
			StringBuffer string = new StringBuffer();
			while (in.ready()) {
				string.append(in.readLine().toLowerCase());
				string.append(" ");
			}
			in.close();
			
			contarNumeroTotalPalavras(string);
			contarRepetidas(string);
			contarNaoRepetidas(string);

		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}

	}
	
	private int contarNumeroTotalPalavras(StringBuffer string){
		ArrayList<String> listPalavras = new ArrayList<String>(Arrays.asList(string.toString().split(" ")));
		System.out.println("numero total de palavras "+ listPalavras.size());
		
		return listPalavras.size();
		
	}
	
	public HashMap<String, Integer> contarRepetidas(StringBuffer string){
		ArrayList<String> listPalavras = new ArrayList<String>(Arrays.asList(string.toString().split(" ")));
		
		/**
		 * Retirando as palavras para comparacao.
		 */
		Set<String> set = new HashSet<>();
		set.addAll(listPalavras);
		
		/**
		 * Map para guardar palavra e quantidade.
		 */
		HashMap<String, Integer> map = new HashMap<>();
		
		for (String palavra : set) {
			int count = 0;
			for (String palavraAux : listPalavras) {
				if(palavra.equals(palavraAux)){
					count++;
				}
			}
			if (count > 1) {
				map.put(palavra, count);
			}
		}
		System.out.println("Repetidas " + map.toString());
		return map;
	}
	
	public HashMap<String, Integer> contarNaoRepetidas(StringBuffer string){
		ArrayList<String> listPalavras = new ArrayList<String>(Arrays.asList(string.toString().split(" ")));
		
		/**
		 * Retirando as palavras para comparacao.
		 */
		Set<String> set = new HashSet<>();
		set.addAll(listPalavras);
		
		/**
		 * Map para guardar palavra e quantidade.
		 */
		HashMap<String, Integer> map = new HashMap<>();
		int countTotal = 0;
		for (String palavra : set) {
			int count = 0;
			
			for (String palavraAux : listPalavras) {
				if (palavraAux.contains(palavra)) {
					count++;
				}
			}
			if (count == 1) {
				countTotal++;
				map.put(palavra, count);
			}
		}
		System.out.println("Nao repetirdas " + map.toString());
		System.out.println("Total Nao repetirdas " + countTotal);
		return map;
	}
	
}
